package mmq;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.UUID;

import com.google.protobuf.ByteString;
import com.google.protobuf.CodedOutputStream;
import com.google.protobuf.ExtensionRegistry;
import com.google.protobuf.GeneratedMessage.GeneratedExtension;

import mmq.proto.Marathon;
import mqm.proto.Sample;
import mqm.proto.Sample.Message;

public class Main {

	public static void main(String[] args) throws IOException {
		
//		ByteArrayOutputStream baos = new ByteArrayOutputStream();
//		Marathon.Message.newBuilder()
//			.setId(666)
//			.setExtension(Marathon.StringMessage.payload, "TEST PAYLOAD")
//			.addHeader(
//				Marathon.Header.newBuilder()
//					.setName("name")
//					.setExtension(Marathon.StringHeader.value, "Tommy"))
//			.addHeader(
//				Marathon.Header.newBuilder()
//					.setName("age")
//					.setExtension(Marathon.IntegerHeader.value, 31))
//			.build()
//			.writeTo(baos);
//		byte[] buf = baos.toByteArray();
//		System.out.println(buf.length);
//		
//		byte[] buf0 = new byte[10];
//		System.arraycopy(buf, 0, buf0, 0, 10);
//	
//		byte[] buf1 = new byte[10];
//		System.arraycopy(buf, 10, buf1, 0, 10);
//		
//		byte[] buf2 = new byte[10];
//		System.arraycopy(buf, 20, buf1, 0, 10);
//		
//		byte[] buf3 = new byte[10];
//		System.arraycopy(buf, 30, buf1, 0, 10);
//		
//		byte[] buf4 = new byte[10];
//		System.arraycopy(buf, 40, buf1, 0, 1);
//		
//		Marathon.Message.newBuilder()
//			.mergeFrom(buf0)
//			.mergeFrom(buf1)
//			.mergeFrom(buf2)
//			.mergeFrom(buf3)
//			.mergeFrom(buf4);
		
		
		
		int max = 0;
		for(int i = 0; i < Integer.MAX_VALUE; i++) {
			int n = CodedOutputStream.computeRawVarint32Size(i);
			if(n > max) {
				System.out.println(String.format("%d -> %d", i, n));
				max = n;
			}
		}
		System.out.println(max);
		
//		System.out.println(String.valueOf(UUID.randomUUID()).length());
		
		
//		Marathon.Message msg = Marathon.Message.newBuilder()
//			.addHeader(
//				Marathon.Header.newBuilder()
//					.setName("foo")
//					.setExtension(Marathon.StringHeader.value, "BAZ"))
//			.addHeader(
//				Marathon.Header.newBuilder()
//					.setName("meep")
//					.setExtension(Marathon.IntegerHeader.value, 666))
//			.build();
//		System.out.println(msg.getSerializedSize());
		
		
//		Sample.Message msg = Sample.Message.newBuilder()
//			.addHeader(Sample.Header.newBuilder().setName("id").setValue("666").build())
//			.addHeader(Sample.Header.newBuilder().setName("replyTo").setValue("QUEUE.XXX").build())
//			.setExtension(
//				Sample.ExpirableMessage.ttl, 120)
//			.setExtension(
//				Sample.ByteMessage.payload, ByteString.copyFrom("TEST QUEUE MESSAGE", "UTF-8"))
//			.build();
//		int size = msg.getSerializedSize();
//		System.out.println(size);
//		byte[] buffer = msg.toByteArray();
//		ExtensionRegistry registry = ExtensionRegistry.newInstance();
//		registry.add(Sample.ByteMessage.payload);
//		registry.add(Sample.ExpirableMessage.ttl);
//		Message msg2 = Sample.Message.parseFrom(buffer, registry);
//		for(Sample.Header h : msg2.getHeaderList())
//			System.out.println(String.format("%s=%s", h.getName(), h.getValue()));
//		if(msg2.hasExtension(Sample.ByteMessage.payload))
//			System.out.println(msg2.getExtension(Sample.ByteMessage.payload).toStringUtf8());
//		if(msg2.hasExtension(Sample.ExpirableMessage.ttl))
//			System.out.println(msg2.getExtension(Sample.ExpirableMessage.ttl));
	}
	
}
